package intranet.server;

/**
 * @author Robin TROADEC
 */
import intranet.client.DataBaseService;

import java.sql.Connection;

import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;


import com.google.gwt.user.server.rpc.RemoteServiceServlet;

@SuppressWarnings("serial")
public class DataBaseServiceImpl extends RemoteServiceServlet implements
		DataBaseService {

	String DB, User, Password;
	Connection connect = null;
	//Info connexion
	String url = "jdbc:postgresql:";
    String db = "intranet-grpc";
    String driver = "org.postgresql.Driver";
    String user = "postgres";
    String pass = "grpc";

    /**
     * Fonction de connection 
     * @return vrai si connecté
     * @return faux sinon
     */
	public boolean connect() {
		
		try {
		    Class.forName("org.postgresql.Driver");
	 
		  } catch (ClassNotFoundException e) {
		    System.out.println("Can't find the JDBC driver in your path!");
		    e.printStackTrace();
		    return false;
		  }
	 
		  System.out.println("PostgreSQL JDBC driver loaded!");
	
	 
		  try {
	 
			 // connect = DriverManager.getConnection("jdbc:postgresql:intranet-grpc","postgres", "grpc");
			  connect = DriverManager.getConnection(url+db,user, pass);
		  } catch (SQLException e) {
		    System.out.println("Connection Failed!");
		    e.printStackTrace();
		    return false;
		  }
		  return true;
	}
	
	/**
     * Fonction de deconnection 
     * @return vrai si connecté
     * @return faux sinon
     */
	public boolean disconnect()
	  {
	      try{
	          connect.close();
	       return true;
	          } catch (Exception e){}
	          return false;
	  }
	
	
	
	/**
	 * Fonction de selection de la base de donnée
	 * @param Request - La requete sql
	 * @return Le résultat de la requete HashMap<String, String[]>
	 */
	public HashMap<String, String[]> select(String Requete) 
	{
		HashMap<String, String[]> superArray=null;
		//Essai de connection
		if (connect())
		{
			ResultSetMetaData data=null;
			Statement state = null;
			ResultSet result = null;
			
			//Essai d'execution de la requete
			try {
				state = connect.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
				result = state.executeQuery(Requete);
				data = result.getMetaData();
				superArray = new HashMap<String, String[]>();
				
				String[] s;
			
				//Recuperation des résultats
				for (int i = 1; i <= data.getColumnCount(); i++) 
				{			
					//Methode pour recuperer le nombre de tuples retournés
					result.last();
					s= new String[result.getRow()];
					System.out.println("TailleV : "+result.getRow());
					int rang =0;
					result.beforeFirst();
					
					//Pour chaque tuple
					while (result.next())
					{
						s[rang]=result.getString(i);
						rang++;
					}
					superArray.put(data.getColumnName(i),s);
				}
					
			} catch (Exception e) 
			{
				e.printStackTrace();
			}
			disconnect();
			return superArray;
		}
		else
		{
			disconnect();
			return superArray;
		}
	}
	
	/**
	 * Fonction d'insertion dans la base de donnée
	 * @param Requete - La requete d'insertion
	 * @return La valeur de la clef générée
	 */
	 public int insert(String requete)
	 {
		 Statement state=null; 
		 int x=-1;
		 if (connect())
		 {
		 try{
			 state=connect.createStatement();
			 x=state.executeUpdate(requete,Statement.RETURN_GENERATED_KEYS);
			 ResultSet rs = state.getGeneratedKeys();
			 if (rs.next())
			 {
				 x=rs.getInt(1);
			 }
		 }
		 catch (Exception e)
		 {
			 System.out.println("Erreur lors du insert");
			 e.printStackTrace();
		 }
		 disconnect();
		 }
		 return x;
	 }
	 
	 	/**
		 * Fonction de suppression dans la base de donnée
		 * @param Requete - La requete d'insertion
		 * @return >0 si réussi
		 * @return <0 sinon
		 */
	 public int delete(String requete)
	 {
		 Statement state=null; 
		 int x=-1;
		 if (connect())
		 {
		 try
		 {
			 state=connect.createStatement();
			 x=state.executeUpdate(requete);
		 }
		 catch (Exception e){}
		 disconnect();
		 }
		 return x;
	 }
	 
	 /**
		  * Fonction de mise à jour dans la base de donnée
		 * @param Requete - La requete d'insertion
		 * @return >0 si réussi
		 * @return <0 sinon
		 */
	 public int update(String requete)
	 {
		 Statement state=null; 
		 int x=-1;
		 if (connect())
		 {
			 x=-2;
		 try{
			 state=connect.createStatement();
			 x=state.executeUpdate(requete);
		 }
		 catch (Exception e){}
		 disconnect();
		 }
		 return x;
	 }

	

}
